"""
构建模型类
    ORM映射关系
        flask-sqlalchemy 的关系映射和 Django-orm 类似:
            类 对应 表
            类属性 对应 字段
            实例对象 对应 记录


    常用的字段类型:
    类型名	    python接收类型	mysql生成类型	    说明
    Integer	    int	            int	                整型
    Float	    float	        float	            浮点型
    Boolean	    bool	        tinyint	        整型, 只占1个字节
    Text	    str	            text	        文本类型, 最大64KB
    LongText	str	            longtext	    文本类型, 最大4GB
    String	    str	            varchar	        变长字符串, 必须限定长度
    Date	    datetime.date	date	        日期
    DateTime	datetime.datetime	datetime	日期和时间
    Time	    datetime.time	time	        时间


    常用的字段选项:
    选项名	            说明
    primary_key	    如果为True，表示该字段为表的主键, 默认自增
    unique	        如果为True，代表这列设置唯一约束
    nullable	    如果为False，代表这列设置非空约束
    default	        为这列设置默认值默认
    index	        如果为True，为这列创建索引，提高查询效率

    注意点: 如果没有给对应字段的类属性设置default参数, 且添加数据时也没有给该字段赋值, 则 sqlalchemy会给该字段设置默认值 None
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)


# 相关配置
# 设置数据库连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/Test"
# # 是否追踪数据库修改(开启后会触发一些钩子函数)  一般不开启, 会影响性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 是否显示底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = True

# 初始化组件对象, 直接关联Flask应用
db = SQLAlchemy(app)


# 构建模型类  类->表  类属性->字段  实例对象->记录
class User(db.Model):
    """
    注意点:
        模型类必须继承 db.Model, 其中 db 指对应的组件对象
        表名默认为类名小写, 可以通过 __tablename__类属性 进行修改
        类属性对应字段, 必须是通过 db.Column() 创建的对象
        可以通过 create_all() 和 drop_all()方法 来创建和删除所有模型类对应的表
    """
    # 设置表名, 表名默认为类名小写
    __tablename__ = 't_user'
    id = db.Column(db.Integer, primary_key=True)  # 设置主键, 默认自增
    name = db.Column('username', db.String(20), unique=True)  # 设置字段名 和 唯一约束
    age = db.Column(db.Integer, default=10, index=True)  # 设置默认值约束 和 索引


if __name__ == '__main__':
    # 删除所有继承自db.Model的表
    db.drop_all()
    # 创建所有继承自db.Model的表
    db.create_all()
    app.run(debug=True)
